﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using RzCorportativo.Lib;
using EFramework.Web.TypeExtension;

namespace RzCorportativo.Views.Cadastros
{
    [Lib.Permissao(HasValidation = true)]
    public partial class Vaga : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.IsPostBack)
                return;
            var vagaId = LongExtension.Parse(this.Request["vagaid"], -1);
            if (vagaId > 0)
            {
                Lib.Vaga vaga = Lib.Vaga.Listar(new Lib.Vaga() { VagaId = vagaId }).FirstOrDefault();
                if (vaga != null)
                {
                    this.Title = vaga.Cargo.Nome;
                    this.VagaId.Value = vaga.VagaId.ToString();
                    dadosGeraisCurriculo.LoadModel(vaga);
                    idioma.LoadModel(vaga);
                    CursoCurriculo.LoadModel(vaga);
                    this.Indicacoes.Load(Lib.Indicacao.Listar(new Lib.Indicacao()
                    {
                        VagaId = vaga.VagaId,
                        Status = 2,
                        ResultadoFinal = 1
                    }));
                    Func<Lib.Indicacao, bool> func = (indicacao) =>
                    {
                        return indicacao.ResultadoFinal == 1 && indicacao.Status == 2 && indicacao.Vaga.Status == 1;
                    };
                    Action<Lib.Indicacao, ButtonItem<Lib.Indicacao>> action = (indicacao, item) =>
                    {
                        if (item.Id.Contains("btnCurriculo"))
                        {
                            item.OnClientClick = "ObterCurriculo(" + indicacao.VagaId + ", " + indicacao.UsuarioIndicadoId + ", { Day: " + indicacao.DataCadastro.Day +
                                ", Month: " + indicacao.DataCadastro.Month + ", Year: " + indicacao.DataCadastro.Year + "}, this);";
                        }
                        else if (item.Id.Contains("btnAceitar"))
                            item.OnClientClick = "Aceitar(" + indicacao.VagaId + ", " + indicacao.UsuarioIndicadoId + ", { Day: " + indicacao.DataCadastro.Day +
                                ", Month: " + indicacao.DataCadastro.Month + ", Year: " + indicacao.DataCadastro.Year + "}, this);";
                        else if (item.Id.Contains("btnRecuar"))
                            item.OnClientClick = "Recusar(" + indicacao.VagaId + ", " + indicacao.UsuarioIndicadoId + ", { Day: " + indicacao.DataCadastro.Day +
                                ", Month: " + indicacao.DataCadastro.Month + ", Year: " + indicacao.DataCadastro.Year + "}, this);";
                    };
                    this.Indicacoes.AddButton(new ButtonItem<Lib.Indicacao>() { Type="button", Id="btnCurriculo", CssClass = "btn btn-primary", Text = "currículo", OnCreateValidation = func, OnCreate = action });
                    this.Indicacoes.AddButton(new ButtonItem<Lib.Indicacao>() { Type = "button", Id = "btnAceitar", CssClass = "btn btn-success", Text = "aprovar", OnCreateValidation = func, OnCreate = action });
                    this.Indicacoes.AddButton(new ButtonItem<Lib.Indicacao>() { Type = "button", Id = "btnRecuar", CssClass = "btn btn-danger", Text = "reprovar", OnCreateValidation = func, OnCreate = action });
                }
            }

        }

        [WebMethod]
        public static object SalvarVaga(Lib.Vaga vaga)
        {
            try
            {
                if (vaga == null)
                    throw new Exception("O objeto fornecido não pode ser nulo");
                //if (vaga.VagaId > 0)
                //    vaga = Lib.Vaga.Create(vaga.VagaId);
                vaga.UsuarioId = (AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId;
                string erros = string.Empty;
                if (vaga.VagaId == -1)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Código de vaga inválido";
                if (vaga.CargoId == -1) 
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Cargo inválido";
                //if (vaga.SalarioOferecido == null) ;
                if (vaga.Disponibilidade == -1)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Disponibilidade de horário inválido";
                if (vaga.TipoVaga == "0")
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Tipo da vaga inválido";
                if(vaga.DataFimInscricao == DateTime.MinValue)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Data de inicio das inscrições inválida";
                if (vaga.DataFimInscricao == DateTime.MinValue)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Data de encerramento das inscrições inválida";
                if (vaga.QtdVagas <= 0)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Quantidade de vagas insuficiente";
                //if (vaga.PretencaoSalarial.Equals(-1))
                //    erros += "Pretenção salarial inválido";
                //if (vaga.DisponibilidadeHorario.Equals(-1))
                //    erros += (erros.Length > 0 ? ";" : string.Empty) + "Disponibilidade de horário inválido";
                if (vaga.UsuarioId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválida, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };
                bool isNew = vaga.IsNew;
                if (vaga.IsNew)
                {
                    vaga.Status = 1;// (short)(vaga.TipoVaga == ((int)Lib.TipoVaga.Externo).ToString() ? 2 : 1);
                }
                if (vaga.Salvar())
                {
                    if (isNew)
                    {
                        vaga.Cargo = Lib.Cargo.Listar(new Cargo() { CargoId = vaga.CargoId }).FirstOrDefault() ?? new Lib.Cargo();
                        Lib.Login.Listar(new Lib.Login() { TipoLogin = TipoLogin.Interno }).ForEach(a =>
                        {
                            try
                            {
                                a.Notificar(new Notificacao()
                                {
                                    TipoNotificacao = "A",
                                    Titulo = "CADASTRO DA VAGA " + vaga.VagaId,
                                    Menssagem = "<p>A Empresa <strong>" + (a.Usuario ?? new Lib.Usuario()).Nome + "</strong></p><p>cadastrou uma vaga.</p><p>Cargo: <strong>" + vaga.Cargo.Nome + "</strong></p>"
                                });
                            }
                            catch (Exception ex)
                            {
                            }
                        });
                    }
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = vaga.VagaId
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true,
                        Value = 0
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true,
                    Value = 0
                };
            }
        }

        [WebMethod]
        public static object RemoveIdiomaVaga(Idioma idioma, long vagaId)
        {
            try
            {
                string erros = string.Empty;
                if (idioma.IdiomaId.Equals(-1))
                    erros += "Idioma inválido";
                if (vagaId.Equals(-1))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                Lib.Vaga vaga = new Lib.Vaga();
                vaga.VagaId = vagaId;
                if (vaga.RemoverIdioma(idioma))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item excluido com sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object AddIdiomaVaga(Idioma idioma, long vagaId)
        {
            try
            {
                string erros = string.Empty;
                
                if (idioma.IdiomaId.Equals(0))
                    erros += "Idioma inválido";
                if (string.IsNullOrEmpty(idioma.Nivel))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Nivel inválido";
                if (vagaId.Equals(-1))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                Lib.Vaga vaga = new Lib.Vaga();
                vaga.VagaId = vagaId;
                if(vaga.AdicionarIdioma(idioma))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object AddFormacao(Lib.Formacao formacao, long vagaId)
        {
            try
            {
                if (formacao == null)
                    throw new Exception("O objeto fornecido não pode ser nulo");
                formacao.UsuarioId = (AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId;
                string erros = string.Empty;
                if (vagaId.Equals(0))
                    erros += "Ano de inicio inválido";
                if (formacao.CursoId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Curso inválido";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };
                Lib.Vaga vaga = new Lib.Vaga();
                vaga.VagaId = vagaId;
                if (vaga.AdicionarFormacao(formacao))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = formacao.CursoId
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true,
                        Value = 0
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true,
                    Value = 0
                };
            }
        }

        [WebMethod]
        public static object RemoveFormacao(int formacaoId, long vagaId)
        {
            var formacao = new Formacao();
            formacao.FormacaoId = formacaoId;
            try
            {
                if (formacao.Excluir())
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item excluido com sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }
    }
}